#include <iostream>
#include <fstream>
#include <string>
#include "JsonTest.h"

using namespace SystemTool;

static void LogFile(std::string strMsg)
{
    std::string strFilePath = "/Users/tangyingzhong/Desktop/12.log";
    std::fstream os(strFilePath,std::ios::app | std::ios::out);
    os << strMsg << "\n";
    os.close();
}

static void ParseJson()
{
    std::string strJsonData = "{ \
    \"name\":\"tyz\", \
    \"age\":-45, \
    \"boy\":true, \
    \"money\":3020.89, \
    \"shoes\":[  \
        90, \
        3.90,  \
        true, \
        \"diff\", \
        { \
            \"inner\":false, \
            \"OK\":89  \
        }\
    ]}";

    SystemTool::JsonDocument JsonDoc = SystemTool::JsonDocument::FromJson(strJsonData);
    if(JsonDoc.IsNull())
    {
        std::cout << "JsonDoc is null\n";
        return;
    }
    std::string strName = JsonDoc.GetKeyValue("name").ToString();
    const std::type_info& info = JsonDoc.GetKeyValue("age").GetDataType();
    if (info == typeid(int))
    {
        int iAge = JsonDoc.GetKeyValue("age").ToInt();
    }
    bool bIsBoy = JsonDoc.GetKeyValue("boy").ToBool();
    double dMoney = JsonDoc.GetKeyValue("money").ToDouble();

    SystemTool::JsonDocument JsonArr = JsonDoc.GetKeyValue("shoes");
    int iSize = JsonArr.Size();
    int iD1 = JsonArr[0].ToInt();
    double iD2 = JsonArr[1].ToDouble();
    bool iD3 = JsonArr[2].ToBool();
    std::string iD4 = JsonArr[3].ToString();
    
    SystemTool::JsonDocument JsonObj = JsonArr[4];
    std::vector<std::string> vKeyTable1;
    JsonObj.GetAllKeys(vKeyTable1);
    for (size_t index = 0; index < vKeyTable1.size(); index++)
    {
        std::cout << vKeyTable1[index] << std::endl;
    }
    std::cout << "Finish json obj\n";

    bool bD5 = JsonObj.GetKeyValue("inner").ToBool();
    int iD6 = JsonObj.GetKeyValue("OK").ToInt();
    std::cout << iD6 << std::endl;

    if(JsonDoc.IsContainKey("boy"))
    {
       std::cout << "Exist boy\n";  
    }
    else
    {
        std::cout << "Not exist boy\n";
    }

    if(JsonObj.IsContainKey("inner"))
    {
       std::cout << "Exist inner\n";  
    }
    else
    {
        std::cout << "Not exist inner\n";
    }

    std::vector<std::string> vKeyTable;
    JsonDoc.GetAllKeys(vKeyTable);

    std::cout << "Finish\n";
}

static void BuildJson()
{
    SystemTool::JsonDocument JsonDoc1;
    bool bIsEmpty = JsonDoc1.IsEmpty();

    SystemTool::JsonDocument JsonDoc;
    JsonDoc.SetKeyValue("wifi",true);
    JsonDoc.SetKeyValue("open","my mind");
    JsonDoc.SetKeyValue("people",89801);
    JsonDoc.SetKeyValue("score",98.7);
    
    SystemTool::JsonDocument JsonArr;
    JsonArr.Append("anywhere");
    JsonArr.Append(779);
    JsonArr.Append(8.97867777);
    JsonArr.Append(false);
    std::string strJsonData1 = JsonArr.ToJson();
    std::cout << strJsonData1 << std::endl;
    JsonArr.ToJsonFile("/Users/tangyingzhong/Desktop/test1.json");

    SystemTool::JsonDocument JsonObj;
    JsonObj.SetKeyValue("A","my girl");
    JsonObj.SetKeyValue("B",-9090);

    JsonArr.SetKeyValue("other",JsonObj);
    JsonDoc.SetKeyValue("table", JsonArr);

    std::string strJsnData = JsonDoc.ToJson();
    std::cout << strJsnData << std::endl;
    JsonDoc.ToJsonFile("/Users/tangyingzhong/Desktop/test.json");
    std::cout << "Finished\n";
}

static void ExceptionTest()
{
    // std::string strData = "fkusdhfusjhf";
    // SystemTool::JsonDocument JsonDoc = SystemTool::JsonDocument::FromJson(strData);
    // if(JsonDoc.IsNull())
    // {
    //     std::cout << JsonDoc.GetErrMsg() << std::endl;
    //     return;
    // }

    SystemTool::JsonDocument JsonDoc = SystemTool::JsonDocument::FromJsonFile("/Users/tangyingzhong/Desktop/test.json");
    if(JsonDoc.IsNull())
    {
        std::cout << JsonDoc.GetErrMsg() << std::endl;
        return;
    }
    std::string strData2 = JsonDoc.GetKeyValue("dgsgsdg").ToString();
    std::cout << strData2 << std::endl;
}

void JsonTest()
{
    // ParseJson();
    // BuildJson();
    ExceptionTest();
}
